package com.ruoyi.file.service.impl;

import java.awt.*;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDateTime;
import java.util.List;

import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.Enums;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.file.domain.FileRecode;
import com.ruoyi.file.mapper.FileRecodeMapper;
import com.ruoyi.file.service.IFileRecodeService;
import com.ruoyi.file.utils.FileEn1;
import com.ruoyi.file.utils.FileEnAES;
import com.ruoyi.file.utils.FileEnBase64;
import com.ruoyi.file.utils.FileEnPBE;
import org.apache.tomcat.util.net.openssl.ciphers.Encryption;
import org.checkerframework.checker.units.qual.K;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

/**
 * 【请填写功能名称】Service业务层处理
 *
 * @author ruoyi
 * @date 2023-03-13
 */
@Service
public class FileRecodeServiceImpl implements IFileRecodeService
{
    private static final String KEYPATH = "Key1.dat";
    private static final String KEY = "BISHE";
    @Autowired
    private FileRecodeMapper fileRecodeMapper;

    /**
     * 查询【请填写功能名称】
     *
     * @param fileId 【请填写功能名称】主键
     * @return 【请填写功能名称】
     */
    @Override
    public FileRecode selectFileRecodeByFileId(Long fileId)
    {
        return fileRecodeMapper.selectFileRecodeByFileId(fileId);
    }

    /**
     * 查询【请填写功能名称】列表
     *
     * @param fileRecode 【请填写功能名称】
     * @return 【请填写功能名称】
     */
    @Override
    public List<FileRecode> selectFileRecodeList(FileRecode fileRecode)
    {
        return fileRecodeMapper.selectFileRecodeList(fileRecode);
    }

    /**
     * 新增【请填写功能名称】
     *
     * @param fileRecode 【请填写功能名称】
     * @return 结果
     */
    @Override
    public void insertFileRecode(List<FileRecode> list, SysUser user)
    {
        String defaultBaseDir = RuoYiConfig.getProfile();
        list.forEach(fileRecode -> {
            fileRecode.setCreateUserName(user.getUserName());
            fileRecode.setCreateUserId(user.getUserId());
            fileRecode.setCTime(LocalDateTime.now());
            String path = defaultBaseDir + StringUtils.substringAfter(fileRecode.getUrl(), Constants.RESOURCE_PREFIX);
            if(!Enums.EncryptType.NO_Encrypt.getValue().equals(fileRecode.getEncryptType())) {
                fileRecode.setIsEncrypt(Enums.EncryptStatus.YES.getValue());
            }
            encryption(fileRecode, path);
            fileRecodeMapper.insertFileRecode(fileRecode);
        });
    }




    /**
     * 修改【请填写功能名称】
     *
     * @param fileRecode 【请填写功能名称】
     * @return 结果
     */
    @Override
    public int updateFileRecode(FileRecode fileRecode)
    {
        return fileRecodeMapper.updateFileRecode(fileRecode);
    }

    /**
     * 批量删除【请填写功能名称】
     *
     * @param fileIds 需要删除的【请填写功能名称】主键
     * @return 结果
     */
    @Override
    public int deleteFileRecodeByFileIds(Long[] fileIds)
    {
        return fileRecodeMapper.deleteFileRecodeByFileIds(fileIds);
    }

    /**
     * 删除【请填写功能名称】信息
     *
     * @param fileId 【请填写功能名称】主键
     * @return 结果
     */
    @Override
    public int deleteFileRecodeByFileId(Long fileId)
    {
        return fileRecodeMapper.deleteFileRecodeByFileId(fileId);
    }

    // 解密
    @Override
    public void decryption(FileRecode fileRecode, String path) {
        Integer encryptType = fileRecode.getEncryptType();
        if (Enums.EncryptType.Encrypt_BASE64.getValue().equals(encryptType)) {
            try {
                FileEnBase64.Decryption(path, path);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // PBE 自定密钥
        else if (Enums.EncryptType.Encrypt_PBE.getValue().equals(encryptType)) {
            try {
                FileEnPBE.Decryption(KEY, path, path);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // AES bat文件
        else if (Enums.EncryptType.Encrypt_AES.getValue().equals(encryptType)) {
            try {
                FileEnAES.Decryption(KEYPATH, path, path);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 加密
    @Override
    public void encryption(FileRecode fileRecode, String path) {
        Integer encryptType = fileRecode.getEncryptType();
        if (Enums.EncryptType.Encrypt_BASE64.getValue().equals(encryptType)) {
            try {
                fileRecode.setIsEncrypt(Enums.EncryptStatus.YES.getValue());
                FileEnBase64.Encryption(FileEnPBE.Read(path), path);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // PBE 自定密钥
        else if (Enums.EncryptType.Encrypt_PBE.getValue().equals(encryptType)) {
            try {
                fileRecode.setIsEncrypt(Enums.EncryptStatus.YES.getValue());
                FileEnPBE.Encryption(KEY, FileEnPBE.Read(path), path);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // AES bat文件
        else if (Enums.EncryptType.Encrypt_AES.getValue().equals(encryptType)) {
            try {
                fileRecode.setIsEncrypt(Enums.EncryptStatus.YES.getValue());
                FileEnAES.Encryption(KEYPATH, FileEnAES.Read(path), path);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
